class TimeUtil {
    /**
     * 将 Date 对象格式化为指定格式的字符串
     * @param date 日期对象
     * @param format 格式字符串，如 'YYYY-MM-DD HH:mm:ss'
     * @returns 格式化后的字符串
     */
    static format(date: Date, format: string = 'YYYY-MM-DD HH:mm:ss'): string {
        const year = date.getFullYear();
        const month = date.getMonth() + 1;
        const day = date.getDate();
        const hour = date.getHours();
        const minute = date.getMinutes();
        const second = date.getSeconds();

        return format
            .replace('YYYY', year.toString())
            .replace('MM', month.toString().padStart(2, '0'))
            .replace('DD', day.toString().padStart(2, '0'))
            .replace('HH', hour.toString().padStart(2, '0'))
            .replace('mm', minute.toString().padStart(2, '0'))
            .replace('ss', second.toString().padStart(2, '0'));
    }

    /**
     * 获取当前时间戳（毫秒）
     * @returns 时间戳
     */
    static now(): number {
        return Date.now();
    }

    /**
     * 计算两个日期之间的差值（天数）
     * @param date1 第一个日期
     * @param date2 第二个日期，默认为当前日期
     * @returns 天数差
     */
    static diffDays(date1: Date, date2: Date = new Date()): number {
        const timeDiff = Math.abs(date2.getTime() - date1.getTime());
        return Math.ceil(timeDiff / (1000 * 3600 * 24));
    }

    /**
     * 日期加减操作
     * @param date 基准日期
     * @param days 加减的天数
     * @returns 计算后的日期
     */
    static addDays(date: Date, days: number): Date {
        const result = new Date(date);
        result.setDate(date.getDate() + days);
        return result;
    }

    /**
     * 判断是否为同一天
     * @param date1 第一个日期
     * @param date2 第二个日期
     * @returns 是否为同一天
     */
    static isSameDay(date1: Date, date2: Date): boolean {
        return (
            date1.getFullYear() === date2.getFullYear() &&
            date1.getMonth() === date2.getMonth() &&
            date1.getDate() === date2.getDate()
        );
    }

    /**
     * 将时间戳转换为 Date 对象
     * @param timestamp 时间戳（毫秒）
     * @returns Date 对象
     */
    static fromTimestamp(timestamp: number): Date {
        return new Date(timestamp);
    }

    /**
     * 获取本周第一天（周一）
     * @param date 基准日期，默认为当前日期
     * @returns 本周第一天的 Date 对象
     */
    static getFirstDayOfWeek(date: Date = new Date()): Date {
        const day = date.getDay();
        const diff = date.getDate() - day + (day === 0 ? -6 : 1);
        return new Date(date.setDate(diff));
    }

    /**
     * 获取本月第一天
     * @param date 基准日期，默认为当前日期
     * @returns 本月第一天的 Date 对象
     */
    static getFirstDayOfMonth(date: Date = new Date()): Date {
        return new Date(date.getFullYear(), date.getMonth(), 1);
    }

    /**
     * 获取本月最后一天
     * @param date 基准日期，默认为当前日期
     * @returns 本月最后一天的 Date 对象
     */
    static getLastDayOfMonth(date: Date = new Date()): Date {
        return new Date(date.getFullYear(), date.getMonth() + 1, 0);
    }
}

// 使用示例
const now = new Date();
console.log(TimeUtil.format(now)); // 输出当前时间，格式为 'YYYY-MM-DD HH:mm:ss'
console.log(TimeUtil.diffDays(new Date('2025-01-01'), now)); // 计算与当前日期的天数差
console.log(TimeUtil.addDays(now, 7)); // 当前日期加7天
console.log(TimeUtil.isSameDay(now, new Date())); // 判断是否为同一天